home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / include / linux / msdos_fs.h < prev    next >
C/C++ Source or Header  |  2005-10-13  |  14KB  |  374 lines

  1. #ifndef _LINUX_MSDOS_FS_H
  2. #define _LINUX_MSDOS_FS_H
  3.  
  4. /*
  5.  * The MS-DOS filesystem constants/structures
  6.  */
  7. #include <asm/byteorder.h>
  8.  
  9. #define SECTOR_SIZE    512        /* sector size (bytes) */
  10. #define SECTOR_BITS    9        /* log2(SECTOR_SIZE) */
  11. #define MSDOS_DPB    (MSDOS_DPS)    /* dir entries per block */
  12. #define MSDOS_DPB_BITS    4        /* log2(MSDOS_DPB) */
  13. #define MSDOS_DPS    (SECTOR_SIZE / sizeof(struct msdos_dir_entry))
  14. #define MSDOS_DPS_BITS    4        /* log2(MSDOS_DPS) */
  15. #define CF_LE_W(v)    le16_to_cpu(v)
  16. #define CF_LE_L(v)    le32_to_cpu(v)
  17. #define CT_LE_W(v)    cpu_to_le16(v)
  18. #define CT_LE_L(v)    cpu_to_le32(v)
  19.  
  20.  
  21. #define MSDOS_SUPER_MAGIC 0x4d44 /* MD */
  22.  
  23. #define MSDOS_ROOT_INO    1    /* == MINIX_ROOT_INO */
  24. #define MSDOS_DIR_BITS    5    /* log2(sizeof(struct msdos_dir_entry)) */
  25.  
  26. /* directory limit */
  27. #define FAT_MAX_DIR_ENTRIES    (65536)
  28. #define FAT_MAX_DIR_SIZE    (FAT_MAX_DIR_ENTRIES << MSDOS_DIR_BITS)
  29.  
  30. #define ATTR_NONE    0    /* no attribute bits */
  31. #define ATTR_RO        1    /* read-only */
  32. #define ATTR_HIDDEN    2    /* hidden */
  33. #define ATTR_SYS    4    /* system */
  34. #define ATTR_VOLUME    8    /* volume label */
  35. #define ATTR_DIR    16    /* directory */
  36. #define ATTR_ARCH    32    /* archived */
  37.  
  38. /* attribute bits that are copied "as is" */
  39. #define ATTR_UNUSED    (ATTR_VOLUME | ATTR_ARCH | ATTR_SYS | ATTR_HIDDEN)
  40. /* bits that are used by the Windows 95/Windows NT extended FAT */
  41. #define ATTR_EXT    (ATTR_RO | ATTR_HIDDEN | ATTR_SYS | ATTR_VOLUME)
  42.  
  43. #define CASE_LOWER_BASE    8    /* base is lower case */
  44. #define CASE_LOWER_EXT    16    /* extension is lower case */
  45.  
  46. #define DELETED_FLAG    0xe5    /* marks file as deleted when in name[0] */
  47. #define IS_FREE(n)    (!*(n) || *(n) == DELETED_FLAG)
  48.  
  49. /* valid file mode bits */
  50. #define MSDOS_VALID_MODE (S_IFREG | S_IFDIR | S_IRWXU | S_IRWXG | S_IRWXO)
  51. /* Convert attribute bits and a mask to the UNIX mode. */
  52. #define MSDOS_MKMODE(a, m) (m & (a & ATTR_RO ? S_IRUGO|S_IXUGO : S_IRWXUGO))
  53. /* Convert the UNIX mode to MS-DOS attribute bits. */
  54. #define MSDOS_MKATTR(m)    ((m & S_IWUGO) ? ATTR_NONE : ATTR_RO)
  55.  
  56. #define MSDOS_NAME    11    /* maximum name length */
  57. #define MSDOS_LONGNAME    256    /* maximum name length */
  58. #define MSDOS_SLOTS    21    /* max # of slots for short and long names */
  59. #define MSDOS_DOT    ".          "    /* ".", padded to MSDOS_NAME chars */
  60. #define MSDOS_DOTDOT    "..         "    /* "..", padded to MSDOS_NAME chars */
  61.  
  62. /* media of boot sector */
  63. #define FAT_VALID_MEDIA(x)    ((0xF8 <= (x) && (x) <= 0xFF) || (x) == 0xF0)
  64. #define FAT_FIRST_ENT(s, x)    ((MSDOS_SB(s)->fat_bits == 32 ? 0x0FFFFF00 : \
  65.     MSDOS_SB(s)->fat_bits == 16 ? 0xFF00 : 0xF00) | (x))
  66.  
  67. /* start of data cluster's entry (number of reserved clusters) */
  68. #define FAT_START_ENT    2
  69.  
  70. /* maximum number of clusters */
  71. #define MAX_FAT12    0xFF4
  72. #define MAX_FAT16    0xFFF4
  73. #define MAX_FAT32    0x0FFFFFF6
  74. #define MAX_FAT(s)    (MSDOS_SB(s)->fat_bits == 32 ? MAX_FAT32 : \
  75.     MSDOS_SB(s)->fat_bits == 16 ? MAX_FAT16 : MAX_FAT12)
  76.  
  77. /* bad cluster mark */
  78. #define BAD_FAT12    0xFF7
  79. #define BAD_FAT16    0xFFF7
  80. #define BAD_FAT32    0x0FFFFFF7
  81. #define BAD_FAT(s)    (MSDOS_SB(s)->fat_bits == 32 ? BAD_FAT32 : \
  82.     MSDOS_SB(s)->fat_bits == 16 ? BAD_FAT16 : BAD_FAT12)
  83.  
  84. /* standard EOF */
  85. #define EOF_FAT12    0xFFF
  86. #define EOF_FAT16    0xFFFF
  87. #define EOF_FAT32    0x0FFFFFFF
  88. #define EOF_FAT(s)    (MSDOS_SB(s)->fat_bits == 32 ? EOF_FAT32 : \
  89.     MSDOS_SB(s)->fat_bits == 16 ? EOF_FAT16 : EOF_FAT12)
  90.  
  91. #define FAT_ENT_FREE    (0)
  92. #define FAT_ENT_BAD    (BAD_FAT32)
  93. #define FAT_ENT_EOF    (EOF_FAT32)
  94.  
  95. #define FAT_FSINFO_SIG1    0x41615252
  96. #define FAT_FSINFO_SIG2    0x61417272
  97. #define IS_FSINFO(x)    (le32_to_cpu((x)->signature1) == FAT_FSINFO_SIG1 \
  98.              && le32_to_cpu((x)->signature2) == FAT_FSINFO_SIG2)
  99.  
  100. /*
  101.  * ioctl commands
  102.  */
  103. #define    VFAT_IOCTL_READDIR_BOTH        _IOR('r', 1, struct dirent [2])
  104. #define    VFAT_IOCTL_READDIR_SHORT    _IOR('r', 2, struct dirent [2])
  105.  
  106. /*
  107.  * vfat shortname flags
  108.  */
  109. #define VFAT_SFN_DISPLAY_LOWER    0x0001 /* convert to lowercase for display */
  110. #define VFAT_SFN_DISPLAY_WIN95    0x0002 /* emulate win95 rule for display */
  111. #define VFAT_SFN_DISPLAY_WINNT    0x0004 /* emulate winnt rule for display */
  112. #define VFAT_SFN_CREATE_WIN95    0x0100 /* emulate win95 rule for create */
  113. #define VFAT_SFN_CREATE_WINNT    0x0200 /* emulate winnt rule for create */
  114.  
  115. struct fat_boot_sector {
  116.     __u8    ignored[3];    /* Boot strap short or near jump */
  117.     __u8    system_id[8];    /* Name - can be used to special case
  118.                    partition manager volumes */
  119.     __u8    sector_size[2];    /* bytes per logical sector */
  120.     __u8    sec_per_clus;    /* sectors/cluster */
  121.     __le16    reserved;    /* reserved sectors */
  122.     __u8    fats;        /* number of FATs */
  123.     __u8    dir_entries[2];    /* root directory entries */
  124.     __u8    sectors[2];    /* number of sectors */
  125.     __u8    media;        /* media code */
  126.     __le16    fat_length;    /* sectors/FAT */
  127.     __le16    secs_track;    /* sectors per track */
  128.     __le16    heads;        /* number of heads */
  129.     __le32    hidden;        /* hidden sectors (unused) */
  130.     __le32    total_sect;    /* number of sectors (if sectors == 0) */
  131.  
  132.     /* The following fields are only used by FAT32 */
  133.     __le32    fat32_length;    /* sectors/FAT */
  134.     __le16    flags;        /* bit 8: fat mirroring, low 4: active fat */
  135.     __u8    version[2];    /* major, minor filesystem version */
  136.     __le32    root_cluster;    /* first cluster in root directory */
  137.     __le16    info_sector;    /* filesystem info sector */
  138.     __le16    backup_boot;    /* backup boot sector */
  139.     __le16    reserved2[6];    /* Unused */
  140. };
  141.  
  142. struct fat_boot_fsinfo {
  143.     __le32   signature1;    /* 0x41615252L */
  144.     __le32   reserved1[120];    /* Nothing as far as I can tell */
  145.     __le32   signature2;    /* 0x61417272L */
  146.     __le32   free_clusters;    /* Free cluster count.  -1 if unknown */
  147.     __le32   next_cluster;    /* Most recently allocated cluster */
  148.     __le32   reserved2[4];
  149. };
  150.  
  151. struct msdos_dir_entry {
  152.     __u8    name[8],ext[3];    /* name and extension */
  153.     __u8    attr;        /* attribute bits */
  154.     __u8    lcase;        /* Case for base and extension */
  155.     __u8    ctime_ms;    /* Creation time, milliseconds */
  156.     __le16    ctime;        /* Creation time */
  157.     __le16    cdate;        /* Creation date */
  158.     __le16    adate;        /* Last access date */
  159.     __le16    starthi;    /* High 16 bits of cluster in FAT32 */
  160.     __le16    time,date,start;/* time, date and first cluster */
  161.     __le32    size;        /* file size (in bytes) */
  162. };
  163.  
  164. /* Up to 13 characters of the name */
  165. struct msdos_dir_slot {
  166.     __u8    id;        /* sequence number for slot */
  167.     __u8    name0_4[10];    /* first 5 characters in name */
  168.     __u8    attr;        /* attribute byte */
  169.     __u8    reserved;    /* always 0 */
  170.     __u8    alias_checksum;    /* checksum for 8.3 alias */
  171.     __u8    name5_10[12];    /* 6 more characters in name */
  172.     __le16   start;        /* starting cluster number, 0 in long slots */
  173.     __u8    name11_12[4];    /* last 2 characters in name */
  174. };
  175.  
  176. struct vfat_slot_info {
  177.     int long_slots;        /* number of long slots in filename */
  178.     loff_t longname_offset;    /* dir offset for longname start */
  179.     loff_t i_pos;        /* on-disk position of directory entry */
  180. };
  181.  
  182. #ifdef __KERNEL__
  183.  
  184. #include <linux/buffer_head.h>
  185. #include <linux/string.h>
  186. #include <linux/nls.h>
  187. #include <linux/fs.h>
  188.  
  189. struct fat_mount_options {
  190.     uid_t fs_uid;
  191.     gid_t fs_gid;
  192.     unsigned short fs_fmask;
  193.     unsigned short fs_dmask;
  194.     unsigned short codepage;  /* Codepage for shortname conversions */
  195.     char *iocharset;          /* Charset used for filename input/display */
  196.     unsigned short shortname; /* flags for shortname display/create rule */
  197.     unsigned char name_check; /* r = relaxed, n = normal, s = strict */
  198.     unsigned quiet:1,         /* set = fake successful chmods and chowns */
  199.          showexec:1,      /* set = only set x bit for com/exe/bat */
  200.          sys_immutable:1, /* set = system files are immutable */
  201.          dotsOK:1,        /* set = hidden and system files are named '.filename' */
  202.          isvfat:1,        /* 0=no vfat long filename support, 1=vfat support */
  203.          utf8:1,      /* Use of UTF8 character set (Default) */
  204.          unicode_xlate:1, /* create escape sequences for unhandled Unicode */
  205.          numtail:1,       /* Does first alias have a numeric '~1' type tail? */
  206.          atari:1,         /* Use Atari GEMDOS variation of MS-DOS fs */
  207.          nocase:1;      /* Does this need case conversion? 0=need case conversion*/
  208. };
  209.  
  210. #define FAT_HASH_BITS    8
  211. #define FAT_HASH_SIZE    (1UL << FAT_HASH_BITS)
  212. #define FAT_HASH_MASK    (FAT_HASH_SIZE-1)
  213.  
  214. /*
  215.  * MS-DOS file system in-core superblock data
  216.  */
  217. struct msdos_sb_info {
  218.     unsigned short sec_per_clus; /* sectors/cluster */
  219.     unsigned short cluster_bits; /* log2(cluster_size) */
  220.     unsigned int cluster_size;   /* cluster size */
  221.     unsigned char fats,fat_bits; /* number of FATs, FAT bits (12 or 16) */
  222.     unsigned short fat_start;
  223.     unsigned long fat_length;    /* FAT start & length (sec.) */
  224.     unsigned long dir_start;
  225.     unsigned short dir_entries;  /* root dir start & entries */
  226.     unsigned long data_start;    /* first data sector */
  227.     unsigned long max_cluster;   /* maximum cluster number */
  228.     unsigned long root_cluster;  /* first cluster of the root directory */
  229.     unsigned long fsinfo_sector; /* sector number of FAT32 fsinfo */
  230.     struct semaphore fat_lock;
  231.     int prev_free;               /* previously allocated cluster number */
  232.     int free_clusters;           /* -1 if undefined */
  233.     struct fat_mount_options options;
  234.     struct nls_table *nls_disk;  /* Codepage used on disk */
  235.     struct nls_table *nls_io;    /* Charset used for input and display */
  236.     void *dir_ops;             /* Opaque; default directory operations */
  237.     int dir_per_block;         /* dir entries per block */
  238.     int dir_per_block_bits;         /* log2(dir_per_block) */
  239.  
  240.     spinlock_t inode_hash_lock;
  241.     struct hlist_head inode_hashtable[FAT_HASH_SIZE];
  242. };
  243.  
  244. #define FAT_CACHE_VALID    0    /* special case for valid cache */
  245.  
  246. /*
  247.  * MS-DOS file system inode data in memory
  248.  */
  249. struct msdos_inode_info {
  250.     spinlock_t cache_lru_lock;
  251.     struct list_head cache_lru;
  252.     int nr_caches;
  253.     /* for avoiding the race between fat_free() and fat_get_cluster() */
  254.     unsigned int cache_valid_id;
  255.  
  256.     loff_t mmu_private;
  257.     int i_start;        /* first cluster or 0 */
  258.     int i_logstart;        /* logical first cluster */
  259.     int i_attrs;        /* unused attribute bits */
  260.     int i_ctime_ms;        /* unused change time in milliseconds */
  261.     loff_t i_pos;        /* on-disk position of directory entry or 0 */
  262.     struct hlist_node i_fat_hash;    /* hash by i_location */
  263.     struct inode vfs_inode;
  264. };
  265.  
  266. static inline struct msdos_sb_info *MSDOS_SB(struct super_block *sb)
  267. {
  268.     return sb->s_fs_info;
  269. }
  270.  
  271. static inline struct msdos_inode_info *MSDOS_I(struct inode *inode)
  272. {
  273.     return container_of(inode, struct msdos_inode_info, vfs_inode);
  274. }
  275.  
  276. static inline sector_t fat_clus_to_blknr(struct msdos_sb_info *sbi, int clus)
  277. {
  278.     return ((sector_t)clus - FAT_START_ENT) * sbi->sec_per_clus
  279.         + sbi->data_start;
  280. }
  281.  
  282. static inline void fat16_towchar(wchar_t *dst, const __u8 *src, size_t len)
  283. {
  284. #ifdef __BIG_ENDIAN
  285.     while (len--) {
  286.         *dst++ = src[0] | (src[1] << 8);
  287.         src += 2;
  288.     }
  289. #else
  290.     memcpy(dst, src, len * 2);
  291. #endif
  292. }
  293.  
  294. static inline void fatwchar_to16(__u8 *dst, const wchar_t *src, size_t len)
  295. {
  296. #ifdef __BIG_ENDIAN
  297.     while (len--) {
  298.         dst[0] = *src & 0x00FF;
  299.         dst[1] = (*src & 0xFF00) >> 8;
  300.         dst += 2;
  301.         src++;
  302.     }
  303. #else
  304.     memcpy(dst, src, len * 2);
  305. #endif
  306. }
  307.  
  308. /* fat/cache.c */
  309. extern void fat_cache_inval_inode(struct inode *inode);
  310. extern int fat_access(struct super_block *sb, int nr, int new_value);
  311. extern int fat_get_cluster(struct inode *inode, int cluster,
  312.                int *fclus, int *dclus);
  313. extern int fat_bmap(struct inode *inode, sector_t sector, sector_t *phys);
  314.  
  315. /* fat/dir.c */
  316. extern struct file_operations fat_dir_operations;
  317. extern int fat_search_long(struct inode *inode, const unsigned char *name,
  318.                int name_len, int anycase,
  319.                loff_t *spos, loff_t *lpos);
  320. extern int fat_add_entries(struct inode *dir, int slots,
  321.                struct buffer_head **bh,
  322.                struct msdos_dir_entry **de, loff_t *i_pos);
  323. extern int fat_new_dir(struct inode *dir, struct inode *parent, int is_vfat);
  324. extern int fat_dir_empty(struct inode *dir);
  325. extern int fat_subdirs(struct inode *dir);
  326. extern int fat_scan(struct inode *dir, const unsigned char *name,
  327.             struct buffer_head **res_bh,
  328.             struct msdos_dir_entry **res_de, loff_t *i_pos);
  329.  
  330. /* fat/file.c */
  331. extern struct file_operations fat_file_operations;
  332. extern struct inode_operations fat_file_inode_operations;
  333. extern int fat_notify_change(struct dentry * dentry, struct iattr * attr);
  334. extern void fat_truncate(struct inode *inode);
  335.  
  336. /* fat/inode.c */
  337. extern void fat_attach(struct inode *inode, loff_t i_pos);
  338. extern void fat_detach(struct inode *inode);
  339. extern struct inode *fat_iget(struct super_block *sb, loff_t i_pos);
  340. extern struct inode *fat_build_inode(struct super_block *sb,
  341.             struct msdos_dir_entry *de, loff_t i_pos, int *res);
  342. int fat_fill_super(struct super_block *sb, void *data, int silent,
  343.            struct inode_operations *fs_dir_inode_ops, int isvfat);
  344.  
  345. /* fat/misc.c */
  346. extern void fat_fs_panic(struct super_block *s, const char *fmt, ...);
  347. extern void lock_fat(struct super_block *sb);
  348. extern void unlock_fat(struct super_block *sb);
  349. extern void fat_clusters_flush(struct super_block *sb);
  350. extern int fat_add_cluster(struct inode *inode);
  351. extern int date_dos2unix(unsigned short time, unsigned short date);
  352. extern void fat_date_unix2dos(int unix_date, __le16 *time, __le16 *date);
  353. extern int fat__get_entry(struct inode *dir, loff_t *pos,
  354.               struct buffer_head **bh,
  355.               struct msdos_dir_entry **de, loff_t *i_pos);
  356. static __inline__ int fat_get_entry(struct inode *dir, loff_t *pos,
  357.                     struct buffer_head **bh,
  358.                     struct msdos_dir_entry **de, loff_t *i_pos)
  359. {
  360.     /* Fast stuff first */
  361.     if (*bh && *de &&
  362.         (*de - (struct msdos_dir_entry *)(*bh)->b_data) < MSDOS_SB(dir->i_sb)->dir_per_block - 1) {
  363.         *pos += sizeof(struct msdos_dir_entry);
  364.         (*de)++;
  365.         (*i_pos)++;
  366.         return 0;
  367.     }
  368.     return fat__get_entry(dir, pos, bh, de, i_pos);
  369. }
  370.  
  371. #endif /* __KERNEL__ */
  372.  
  373. #endif
  374.